import random
from datetime import datetime
import requests
import json

class AIService:
    @staticmethod
    def generate_story(title, category, keywords, length, style):
        # Moonshot API 配置
        AI_API_URL = "https://api.moonshot.cn/v1/chat/completions"
        AI_API_KEY = "sk-acGHs8se8ReRJPVo1BQpkPCPPTGPumZCaTwdiQombmj42LHi"
        
        # 根据长度设置字数限制
        content_length = {
            'short': 500,
            'medium': 1000,
            'long': 2000
        }.get(length, 1000)
        
        # 构建提示词
        prompt = f"""请用中文生成一个故事，按照以下要求:
        - 类型：{category}
        - 关键词：{keywords}
        - 字数限制：约{content_length}字
        - 风格：{style}
        """
        
        # 如果提供了标题，使用用户提供的标题
        if title:
            prompt += f"\n标题：{title}"
            user_title = title
        else:
            prompt += "\n请为故事创建一个吸引人的中文标题"
            user_title = None
        
        prompt += """
        
        故事必须使用中文创作，内容要有完整的开头、发展和结局，情节要连贯且引人入胜。
        请使用HTML标签（如<h2>, <p>等）来格式化文本，使其便于阅读。
        返回的格式应为：
        
        标题：你的故事标题
        
        <p>故事正文第一段</p>
        <p>故事正文第二段</p>
        ...以此类推
        """
        
        try:
            # 调用 Moonshot API
            headers = {
                "Content-Type": "application/json",
                "Authorization": f"Bearer {AI_API_KEY}"
            }
            
            data = {
                "model": "moonshot-v1-8k",
                "messages": [
                    {"role": "system", "content": "你是一个专业的中文故事创作者，擅长根据用户提供的关键词创作有趣、吸引人的中文故事。所有输出必须是中文。"},
                    {"role": "user", "content": prompt}
                ],
                "temperature": 0.7
            }
            
            response = requests.post(AI_API_URL, headers=headers, data=json.dumps(data))
            response.raise_for_status()  # 如果请求失败则抛出异常
            
            result = response.json()
            story_content = result['choices'][0]['message']['content']
            
            # 提取标题和内容
            if "标题：" in story_content:
                # 从返回内容中提取标题
                title_start = story_content.find("标题：")
                title_end = story_content.find("\n", title_start)
                if title_end == -1:  # 如果找不到换行符，尝试查找其他分隔符
                    for separator in ["\r", "<h", "<p"]:
                        pos = story_content.find(separator, title_start)
                        if pos != -1:
                            title_end = pos
                            break
                
                ai_title = story_content[title_start+3:title_end].strip()
                content = story_content[title_end:].strip()
            else:
                # 如果没有找到标题标记，尝试提取第一行作为标题
                lines = story_content.strip().split('\n')
                ai_title = lines[0].replace('#', '').strip()
                if len(ai_title) > 100:  # 如果第一行太长，可能不是标题
                    ai_title = f"{category}故事：{keywords.split()[0] if keywords else '冒险'}"
                    content = story_content
                else:
                    content = '\n'.join(lines[1:]).strip()
            
            # 确保内容中有HTML标签，如果没有则添加
            if '<p>' not in content:
                content = '<p>' + content.replace('\n\n', '</p><p>') + '</p>'
                content = content.replace('<p><h', '<h').replace('h></p>', 'h>')
            
            # 使用用户提供的标题或者AI生成的标题
            final_title = user_title if user_title else ai_title
            
            return {
                'title': final_title,
                'content': content,
                'category': category,
                'keywords': keywords
            }
            
        except Exception as e:
            # 如果API调用失败，使用备用方案生成故事
            print(f"API调用失败: {str(e)}")
            # 使用备用的模拟数据生成功能
            if user_title:
                final_title = user_title
            else:
                final_title = f"{category}故事：{keywords.split()[0] if keywords else '冒险'}"
            
            content = f"""
            <h2>{final_title}</h2>
            <p>这是一个关于{keywords}的{category}故事。</p>
            <p>故事发生在{datetime.now().year}年，主角{keywords.split()[0] if keywords else '主人公'}开始了他的冒险。</p>
            """
            
            if style == 'formal':
                content += "<p>这是一个正式的叙事风格。</p>"
            elif style == 'casual':
                content += "<p>这是一个轻松的叙事风格。</p>"
            elif style == 'poetic':
                content += "<p>这是一个诗意的叙事风格。</p>"
            
            for _ in range(3):
                content += f"""
                <p>在旅途中，{keywords.split()[0] if keywords else '主人公'}遇到了{random.choice(['朋友', '敌人', '导师'])}，
                他们一起经历了{random.choice(['冒险', '挑战', '成长'])}。</p>
                """
            
            content += f"""
            <p>最终，{keywords.split()[0] if keywords else '主人公'}完成了他的使命，故事也迎来了结局。</p>
            """
            
            return {
                'title': final_title,
                'content': content,
                'category': category,
                'keywords': keywords
            } 